package sys

import (
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	"menu-generation-go/database"
	"menu-generation-go/handlers/common"
	"menu-generation-go/models"
	"menu-generation-go/utils"
	"time"
)

type AuthLoginHandler struct {
	DB *database.Database
}

func NewAuthLoginHandler(db *database.Database) *AuthLoginHandler {
	return &AuthLoginHandler{DB: db}
}

type LoginRequest struct {
	Account  string `json:"account" binding:"required"`
	Password string `json:"password" binding:"required"`
}

// 登录方法
func (authLogin *AuthLoginHandler) Login(c *gin.Context) {
	var req LoginRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		common.SendErrJSON("参数错误", c)
		return
	}

	// 查找用户-通过用户名
	var user models.MenuUser
	if err := authLogin.DB.GetDB().Where("account = ?", req.Account).First(&user).Error; err != nil {
		common.SendErrJSON("账户不存在", c)
		return
	}

	// 验证密码
	if !user.VerifyPassword(req.Password) {
		common.SendErrJSON("密码错误", c)
		return
	}

	// 检查用户状态
	if user.Status != 1 {
		common.SendErrJSON("账号已被禁用", c)
		return
	}

	// 创建并插入会话记录
	// 2. 创建并插入会话记录
	session := models.UserSession{
		UserID:     user.ID,
		OrgId:      user.OrgID,
		NickName:   user.NickName,
		GroupId:    user.GroupID,
		DeviceInfo: c.GetHeader("User-Agent"),           // 获取设备信息
		IPAddress:  c.ClientIP(),                        // 获取客户端IP
		ExpiresAt:  time.Now().Add(time.Hour * 24 * 14), // 14天后过期
		IsActive:   true,
	}

	// 3. 将会话记录插入数据库
	if err := authLogin.DB.GetDB().Create(&session).Error; err != nil {
		common.SendErrJSON("创建会话失败", c)
		return
	}
	// 生成token
	token, err := utils.GenerateToken(session.ID, user.ID)
	if err != nil {
		common.SendErrJSON("生成用户令牌失败", c)
		return
	}
	// 3. 更新会话记录中的token字段
	if err := authLogin.DB.GetDB().Model(&session).Update("token", token).Error; err != nil {
		common.SendErrJSON("更新会话Token失败", c)
		return
	}
	common.Ok(c, gin.H{
		"token": token,
		"user": gin.H{
			"id":       user.ID,
			"groupID":  user.GroupID,
			"orgID":    user.OrgID,
			"nickname": user.NickName,
			"status":   user.Status,
			"account":  user.Account,
		}})
}

// 退出登录
func (authLogin AuthLoginHandler) Logout(c *gin.Context) {
	// 从请求头获取Token
	token := c.GetHeader("token")
	if token == "" {
		common.SendErrJSON("未提供认证令牌", c)
		return
	}
	claims, err := utils.ParseToken(token)
	if err != nil {
		common.SendErrJSON("无效的令牌", c)
		return
	}

	// 使用事务确保操作原子性
	err = authLogin.DB.GetDB().Transaction(func(tx *gorm.DB) error {
		// 1. 使当前会话失效
		if err := tx.Model(&models.UserSession{}).
			Where("id = ?", claims.SessionID).
			Update("is_active", false).Error; err != nil {
			return err
		}
		return nil
	})

	if err != nil {
		common.SendErrJSON("退出登录失败", c)
		return
	}

	common.Ok(c, "退出登录成功")
}
